package net.zoneland.knowledge.enums;

import net.zoneland.knowledge.constant.Constants;
import net.zoneland.knowledge.model.WorkApplyInfo;
import net.zoneland.knowledge.model.WorkApproveOpinion;
import net.zoneland.knowledge.utils.DateHelper;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;

import java.time.LocalDate;
import java.util.Comparator;
import java.util.Optional;

/**
 * 书记项目立项书打印的审批表，字段映射枚举.
 *
 */
public enum SecretaryProjectFormExcelEnum {

    /**
     * 表名.
     * 这是书记项目立项书的excel下载模板（0, 0）代表表名要放在的excel的第1行，第1列）.
     */
    TABLE_TITLE(0, 0) {
        @Override
        public String getValueFormWorkApplyInfo(final WorkApplyInfo workApplyInfo) {
            return getTableTitle();
        }
    },

    /**
     * 填报单位.
     * 这是书记项目立项书的excel下载模板（1, 1）代表创建时间要放在的excel的第2行，第2列）.
     */
    CREATOR_PARTY_ORG_NAME(1, 1) {
        @Override
        public String getValueFormWorkApplyInfo(final WorkApplyInfo workApplyInfo) {
            return workApplyInfo.getCreatorPartyOrgName();
        }
    },
    /**
     * 创建时间.
     * 这是书记项目立项书的excel下载模板（1,6）代表创建时间要放在的excel的第2行，第7列）.
     */
    CREATE_DATE(1, 6) {
        @Override
        public String getValueFormWorkApplyInfo(final WorkApplyInfo workApplyInfo) {
            return DateFormatUtils.format(workApplyInfo.getCreateTime(), DateHelper.DEFAULT_DATE_FORMAT);
        }
    },
    /**
     * 拟完成课题.
     * 这是书记项目立项书的excel下载模板（2,1）代表title要放在的excel的第3行，第2列）.
     */
    TITLE(2, 1) {
        @Override
        public String getValueFormWorkApplyInfo(final WorkApplyInfo workApplyInfo) {
            return workApplyInfo.getTitle();
        }
    },
    /**
     * 项目负责人.
     * 这是书记项目立项书的excel下载模板，（3,1）代表负责人要放在excel的第4行，第2列）.
     */
    RECEIVER(3, 1) {
        @Override
        public String getValueFormWorkApplyInfo(final WorkApplyInfo workApplyInfo) {
            return workApplyInfo.getReceiverLabel();
        }
    },
    /**
     * 项目完成时限.
     * 这是书记项目立项书的excel下载模板，（3,5）代表项目完成时限要放在excel的第4行，第6列）.
     */
    SEND_UNIT(3, 5) {
        @Override
        public String getValueFormWorkApplyInfo(final WorkApplyInfo workApplyInfo) {
            return workApplyInfo.getSendUnit();
        }
    },
    /**
     * 项目联系人.
     * 这是书记项目立项书的excel下载模板，（3,5）代表项目联系人要放在excel的第5行，第2列）.
     */
    CREATOR_NAME(4, 1) {
        @Override
        public String getValueFormWorkApplyInfo(final WorkApplyInfo workApplyInfo) {
            return workApplyInfo.getContactsLabel();
        }
    },
    /**
     * 项目联系方式.
     * 这是书记项目立项书的excel下载模板，（4,5）代表项目联系方式要放在excel的第5行，第6列）.
     */
    CREATOR_MOBILE(4, 5) {
        @Override
        public String getValueFormWorkApplyInfo(final WorkApplyInfo workApplyInfo) {
            return workApplyInfo.getContactsMobile();
        }
    },
    /**
     * 项目类别.
     * 这是书记项目立项书的excel下载模板，（5,1）代表项目联系类别要放在excel的第6行，第2列）.
     */
    PROJECT_CATEGORY(5, 1) {
        @Override
        public String getValueFormWorkApplyInfo(final WorkApplyInfo workApplyInfo) {
            return workApplyInfo.getProjectCategory();
        }
    },
    /**
     * 攻坚领域.
     * 这是书记项目立项书的excel下载模板，（5,5）代表攻坚领域要放在excel的第6行，第6列）.
     */
    KEY_AREAS_TO_TACKLE(5, 5) {
        @Override
        public String getValueFormWorkApplyInfo(final WorkApplyInfo workApplyInfo) {
            return workApplyInfo.getKeyAreasToTackle();
        }
    },
    /**
     * 项目参与人.
     * 这是书记项目立项书的excel下载模板，（6,1）代表项目参与人要放在excel的第7行，第2列）.
     */
    PARTICIPANTS(6, 1) {
        @Override
        public String getValueFormWorkApplyInfo(final WorkApplyInfo workApplyInfo) {
            return workApplyInfo.getParticipantsLabel();
        }
    },
    /**
     * 项目描述.
     * 这是书记项目立项书的excel下载模板，（7,1）代表项目描述要放在excel的第8行，第2列）.
     */
    DESCRIPTION(7, 1) {
        @Override
        public String getValueFormWorkApplyInfo(final WorkApplyInfo workApplyInfo) {
            return workApplyInfo.getDescription();
        }
    },
    /**
     * 主管部门经办人审核.
     */
    COMPETENT_DEPARTMENTS_AUDIT(10,1) {
        @Override
        public String getValueFormWorkApplyInfo(final WorkApplyInfo workApplyInfo) {
            return getApproveInfo(workApplyInfo, WorkStatusEnum.COMPETENT_DEPARTMENTS_AUDIT.getValue());
        }
    },
    /**
     * 各党（总）支部书记审批.
     */
    PARTY_SECRETARY_APPROVE(12,1) {
        @Override
        public String getValueFormWorkApplyInfo(final WorkApplyInfo workApplyInfo) {
            return getApproveInfo(workApplyInfo, WorkStatusEnum.PARTY_SECRETARY_APPROVE.getValue());
        }
    },
    /**
     * 分管领导（省） 党办（地市）审批.
     */
    RESPONSIBLE_LEADER_APPROVE(14,1) {
        @Override
        public String getValueFormWorkApplyInfo(final WorkApplyInfo workApplyInfo) {
            return getApproveInfo(workApplyInfo, WorkStatusEnum.RESPONSIBLE_LEADER_APPROVE.getValue());
        }
    };

    SecretaryProjectFormExcelEnum(final int rowIndex, final int cellIndex) {
        this.rowIndex = rowIndex;
        this.cellIndex = cellIndex;
    }

    /**
     * 行列.
     */
    private final int rowIndex;

    /**
     * 单元格列
     */
    private final int cellIndex;

    /**
     * 获取审批意见.
     * @param workApplyInfo 工单信息
     * @param nodeId 审批节点
     * @return 用于excel显示的审批信息
     */
    private static String getApproveInfo(final WorkApplyInfo workApplyInfo, final String nodeId) {
        final Optional<WorkApproveOpinion> lastApproveNode = workApplyInfo.getWorkApproveOpinions().stream().
                filter(item -> nodeId.equals(item.getNodeId())).max(Comparator.comparing(WorkApproveOpinion::getApproveTime));
        if (lastApproveNode.isPresent()) {
            final WorkApproveOpinion workApproveOpinion = lastApproveNode.get();
            return  workApproveOpinion.getOpinion() + "\n          " + workApproveOpinion.getApproveName();
        }
        return StringUtils.EMPTY;
    }
    /**
     * 设置单元格
     * @param sheet excel sheet页
     * @param workApplyInfo 工单
     */
    public void setCellValue(final Sheet sheet, final WorkApplyInfo workApplyInfo) {
        final String value = getValueFormWorkApplyInfo(workApplyInfo);
        sheet.getRow(rowIndex).getCell(cellIndex)
                .setCellValue(new XSSFRichTextString(value));//new XSSFRichTextString使换行符生效
    }

    /**
     * 根据工单信息获取要放到excel模板里面对应的属性值.
     * @param workApplyInfo 工单信息.
     * @return 属性值.
     */
    public String getValueFormWorkApplyInfo(final WorkApplyInfo workApplyInfo) {
        return workApplyInfo.getTitle();
    }

    /**
     * 获取表头.
     * 表头是:中国移动浙江公司基层党支部 加上当前年份 再加 年度“领题破题 合力攻坚”项目立项书组合而成.
     * @return 返回表头信息.
     */
    private static String getTableTitle() {
        return Constants.SECRETARY_PROJECT_EXCEL_TITLE_PRE + LocalDate.now().getYear() + Constants.SECRETARY_PROJECT_EXCEL_TITLE_SUF;
    }

}
